﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using SistemaCenterQuimPost.Plantillas; //necesario para obtener fecha, nombre usuario etc,

using SistemaCenterQuimPost.Control; //necesario para validar Observacion

namespace SistemaCenterQuimPost.UI.PostAdministrador
{
    public partial class frmEliminarVenta : SistemaCenterQuimPost.Plantillas.frmPlantillaHijo
    {
        //---------------------ATRIBUTOS------------------------
        
        private DataSet2 centerQuimDs;
        private DataSet2TableAdapters.VentasTableAdapter ventaTa;
        private DataSet2TableAdapters.ProductosxVentaTableAdapter productosxVentaTa;
        private DataSet2TableAdapters.ProductosTableAdapter productosTa;
        private DataSet2TableAdapters.MovimientosxProductoTableAdapter movimientosTa;
       
        //--------------------CONSTRUCTORES---------------------
        
        public frmEliminarVenta()
        {
            InitializeComponent();
            centerQuimDs = new DataSet2();
            ventaTa = new DataSet2TableAdapters.VentasTableAdapter();
            productosxVentaTa = new DataSet2TableAdapters.ProductosxVentaTableAdapter();
            productosTa = new DataSet2TableAdapters.ProductosTableAdapter ();
            movimientosTa = new DataSet2TableAdapters.MovimientosxProductoTableAdapter();
        }

        //-----------------ESTADOS
        private void frmEliminarVenta_Load(object sender, EventArgs e)
        {
            lblError.Visible = false; //Como es un formulario sin estado, este atributo se setea acá.
        }

        //-------------------METODOS VARIOS-------------------------

        private void btnBusVenta_Click(object sender, EventArgs e)
        {
            validarCódigo();

            if (errorProvider1.GetError(txtCodVenta) == "") //si el código de venta es válido.
            {
                try
                {
                    limpiarDatos();

                    buscarVenta();
                }

                catch (IndexOutOfRangeException)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("El código no se encuentra asociado a ninguna venta.", "ELIMINAR VENTAS", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    lblError.Visible = false; //Este atributo se controla en este lugar, ya que es un formulario sin estado.
                }

                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            }else
            {
                informarExistenciaError();
            }
            
        }

        private void validarCódigo() //valida que el código ingresado sea válido.
        {

            errorProvider1.SetError(txtCodVenta, new ValidarDatos().ValidarNaturalesPositivos("Código de Venta:", txtCodVenta.Text));
        }


        private void buscarVenta()
        {
            ventaTa.FillByNroVenta(centerQuimDs.Ventas, Convert .ToInt32 (txtCodVenta.Text.Trim())); //buscamos la venta
            cargarGrilla();
            txtTotal.Text = centerQuimDs.Ventas[0].totalGeneral.ToString();
        }

        private void cargarGrilla()
        {
            productosxVentaTa.FillByNroVenta(centerQuimDs.ProductosxVenta, centerQuimDs.Ventas[0].nroVenta); //buscamos la venta
            
            //recorremos grilla
            for (int i =0; i < centerQuimDs .ProductosxVenta .Rows .Count; i++)
            {
                dgvProductos.Rows.Add(centerQuimDs.ProductosxVenta[i].codProducto, centerQuimDs.ProductosxVenta[i].descripcion, centerQuimDs.ProductosxVenta[i].precioUnitario, centerQuimDs.ProductosxVenta[i].unidades, centerQuimDs.ProductosxVenta[i].kgLts, centerQuimDs.ProductosxVenta[i].subtotal, centerQuimDs.ProductosxVenta[i].descuento);
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (formularioValido())
            {
                try
                {
                    DialogResult result = MessageBox.Show("¿Está seguro en eliminar la venta? ", "CONFIRMACION ELIMINAR", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (result == DialogResult.Yes)
                    {
                        centerQuimDs.Ventas[0].Vigente = false;
                        centerQuimDs.Ventas[0].observacion += txtObservacion.Text;
                        ventaTa.Update(centerQuimDs.Ventas);

                        redefinirStock();
                        //Se muestra un mje de confirmación.
                        MessageBox.Show("Venta eliminada con exito!!!", "AVISO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        limpiarDatos();
                    }
                }
                catch (Exception ex)
                {
                    //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                    MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            
            }else
            {
                informarExistenciaError();

            }

        }

        private bool formularioValido()
        {
            validarObservacion();

            if ((errorProvider1.GetError(txtObservacion) == ""))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void validarObservacion()
        {

            errorProvider1.SetError(txtObservacion, new ValidarDatos().validarLongitud("Descripcion:", txtObservacion.Text + centerQuimDs.Ventas[0].observacion, 100));

        }


        private void limpiarDatos()
        {
            txtTotal.Text = "";
            txtObservacion.Text = "";
            dgvProductos.Rows.Clear();
        }

        private void redefinirStock()

        {
             foreach (DataGridViewRow row in dgvProductos.Rows)
            {
                productosTa.FillByNombre(centerQuimDs.Productos, row.Cells[1].Value.ToString());

                if ((centerQuimDs.Productos[0].tipo == "D") & (centerQuimDs.Productos[0].litrosEnvase == 0)) //es un producto disuelto para vender por granel, se incrementa la base.
                {
                    Double multiplicadorPorcentual = Math.Round((centerQuimDs.Productos[0].porcentaje / 100), 2);  //si el porcentaje era 3, el multiplicador queda: 0,03.

                    Double cantidadIncrementar = Math.Round((Convert.ToDouble(row.Cells[4].Value) * multiplicadorPorcentual), 2);

                    string baseDescripcion = centerQuimDs.Productos[0].baseDescripcion.ToString();
                    
                    productosTa.FillByNombre(centerQuimDs.Productos, baseDescripcion); //en el if de abajo se incrementa del stock de la base.
                   
                    centerQuimDs.Productos [0].stockActual += cantidadIncrementar ; //se incrementa la base

                    movimientosProductosEliminado(centerQuimDs.Productos[0].codProducto, centerQuimDs.Productos[0].descripcion, cantidadIncrementar);
                }
                else //si no se debe ajustar solo se incrementa
                {
                  centerQuimDs.Productos[0].stockActual +=  Convert.ToDouble(row.Cells[3].Value) + Convert.ToDouble(row.Cells[4].Value); //se incrementa el stock de un producto vendido por cantidad

                  movimientosProductosEliminado(centerQuimDs.Productos[0].codProducto, centerQuimDs.Productos[0].descripcion,  Convert .ToDouble (row.Cells[3].Value) + Convert .ToDouble (row.Cells[4].Value) );
                }

                productosTa.Update(centerQuimDs.Productos);

             }

           }

        private string obtenerFechaActual()  //Dato necesario para el alta de venta
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }

        private void movimientosProductosEliminado (string codigo, string nombre, double cantidad)
        {
            movimientosTa.InsertQueryMovimientosxProducto(codigo, nombre, Convert.ToDateTime(obtenerFechaActual()), "A", "Eliminación Venta Nª: " + centerQuimDs.Ventas[0].nroVenta.ToString(),  Convert.ToDecimal (Math .Round ( cantidad,2))); 
        }

        
        }

    }

